package sort.util;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * 功能描述：
 *
 * @Author: yht
 * @Date: 2021/8/13 16:41
 */
public interface MySort {

  /**
   * 排序方法名称
   * @return
   */
  String getName();

  /**
   * 创建一个随机长度的数组
   * @return
   */
  default int[] createArr() {
    Random random = new Random();
    int size = random.nextInt(Constants.MAX_ARR_SIZE);
    int [] res = new int[size];
    for (int i = 0; i < size; i++) {
      res[i] = random.nextInt(Constants.MAX_DATA_VALUE);
    }
    return res;
  }

  /**
   * 创建100个随机长度的数组所用时间
   * @return
   */
  default long create100ArrTime() {
    long start = System.currentTimeMillis();
    int j = 1;
    while (j++ <= Constants.REPEAT_TIMES){
      createArr();
    }
    long end = System.currentTimeMillis();
    return end-start;
  }

  int[] sort(int[] a);

  /**
   * jdk自带方法排序100次用时
   * @return
   */
  default void standardTime(){
    long create100ArrTime = create100ArrTime();
    long start = System.currentTimeMillis();
    int i = 1;
    while (i++ <= Constants.REPEAT_TIMES){
      IntStream is = Arrays.stream(createArr()).sorted();
      is.close();
    }

    long end = System.currentTimeMillis();
    System.out.println("标准执行用时（ms）：" + (end-start-create100ArrTime));
  }

  /**
   * 本方法排序100次用时
   * @return
   */
  default void time(){
    long create100ArrTime = create100ArrTime();
    long start = System.currentTimeMillis();
    int i = 1;
    int err = 0;
    while (i++ <= Constants.REPEAT_TIMES){
      try{
        sort(createArr());
      }catch (Exception e){
        e.printStackTrace();
        err++;
      }
    }
    long end = System.currentTimeMillis();
    System.out.println(getName() + "发生异常次数：" + err );
    System.out.println(getName() + "执行用时（ms）：" + (end-start-create100ArrTime));
  }

  /**
   * 本排序方法准确度，100次有几次正确
   * @return
   */
  default void score(){
    int i = 1;
    int err = 0;//异常次数
    int right = 0;//正确次数
    while (i++ <= Constants.REPEAT_TIMES){
      try{
        int [] a = createArr();
        int [] b = Arrays.stream(Arrays.copyOf(a, a.length)).sorted().toArray();
        int [] c = sort(Arrays.copyOf(a, a.length));
        if(Arrays.equals(b,c)) right++;
      }catch (Exception e){
        e.printStackTrace();
        err++ ;
      }
    }
    System.out.println(getName() + "发生异常次数：" + err );
    System.out.println(getName() + "正确度：" + right);
  }

  default void testAll(){
    standardTime();
    time();
    score();
  }

  default void exchange(int [] a, int i, int j){
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
  }
}
